package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpDepDAO;
import org.jsola.hr.dto.EmpDepAddDTO;
import org.jsola.hr.dto.EmpDepUpdateDTO;
import org.jsola.hr.entity.EmpDepDO;
import org.jsola.hr.query.EmpDepQuery;
import org.jsola.hr.vo.EmpAllInfoVO;
import org.jsola.hr.vo.EmpDepListVO;
import org.jsola.hr.vo.EmpDepVO;
import org.jsola.hr.vo.EmpReduceInfoVO;
import org.jsola.user.core.TokenUser;
import tk.mybatis.mapper.entity.Example;

import javax.validation.constraints.NotNull;
import java.util.List;


/**
 * @author zhr
 */
public interface IEmpDepService extends IService<IEmpDepDAO, EmpDepDO> {

    /**
     * 新增员工部门关系
     * @param empDepAddDTO 新增员工部门关系DTO
     * @param tokenUser 当前用户
     * @return 员工部门关系详情信息
     */
    EmpDepVO save(EmpDepAddDTO empDepAddDTO, TokenUser tokenUser);

    /**
     * 批量新增员工部门关系
     * @param empDepAddDTOList 新增员工部门关系DTO
     * @param tokenUser 当前用户
     * @return 员工部门关系详情信息
     */
    List<EmpDepVO> batchSave(List<EmpDepAddDTO> empDepAddDTOList, TokenUser tokenUser);

    /**
     * 修改员工部门关系
     * @param empDepUpdateDTO 修改员工部门关系DTO
     * @param tokenUser 当前用户
     * @return 更新数量
     */
    int update(EmpDepUpdateDTO empDepUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除员工部门关系，物理删除，更新is_valid字段，从回收站删除
     * @param tokenUser 当前用户
     * @param empDepIds 员工部门关系id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String...empDepIds);

    /**
     * 根据员工部门关系id查找
     * @param empDepId 员工部门关系id
     * @param siteId 所属站点id
     * @return 员工部门关系详情信息
     */
    EmpDepVO selectById(String empDepId, String siteId);

    /**
     * 查询员工部门关系
     * @param empDepQuery 查询条件
     * @param siteId 所属站点id
     * @return 员工部门关系列表信息
     */
    List<EmpDepListVO> select(EmpDepQuery empDepQuery, String siteId);

    /**
    * 查询员工部门关系记录数
    * @param empDepQuery 查询条件
    * @param siteId 所属站点id
    * @return 员工部门关系记录数
    */
    int selectCount(EmpDepQuery empDepQuery, String siteId);

    /**
     * 分页查询员工部门关系
     * @param empDepQuery 查询条件
     * @param siteId 所属站点id
     * @return 员工部门关系列表信息
     */
    Page<EmpDepListVO> selectPage(EmpDepQuery empDepQuery, String siteId);


    /**
     * 根据员工部门关系id查找
     * @param empDepId 员工部门关系id
     * @param siteId 所属站点id
     * @return 员工部门关系
     */
    EmpDepDO selectDOById(String empDepId, String siteId);

    /**
     * 查询员工部门关系
     * @param empDepQuery 查询条件
     * @param siteId 所属站点id
     * @return 员工部门关系列表
     */
    List<EmpDepDO> selectDO(EmpDepQuery empDepQuery, String siteId);


    /**
     * 修改员工部门分配
     * @param empDepAddDTO 员工部门关系DTO
     * @param tokenUser 当前用户
     * @return 更新数量
     */
    Integer empDistribute(EmpDepAddDTO empDepAddDTO, TokenUser tokenUser);

    /**
     * 查询员工部门信息
     * @param example 查询条件
     * @param siteId 站点id
     * @return 查询员工部门信息
     */
    List<EmpDepDO> getEmpByExample(Example example,String siteId);

    /**
     * 根据公司id删除部门
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     */
    void deleteByCompanyId(@NotNull String companyId, TokenUser tokenUser);

    /**
     * 发布员工部门关系
     *
     * @param empDepAddList 员工部门关系
     * @param tokenUser     当前用户
     */
    void publishEmpDepList(List<EmpDepAddDTO> empDepAddList, TokenUser tokenUser);

    /**
     * 查找员工部门关系
     *
     * @param companyId 公司id
     * @param empId     员工id
     * @param depId     部门id
     * @param siteId    站点
     * @return 员工部门关系
     */
    EmpDepVO selectByEmpAndDep(String companyId, String empId, String depId, String siteId);

    /**
     * 根据员工,部门关系删除
     *
     * @param companyId 公司id
     * @param empId     员工id
     * @param depId     部门id
     * @param tokenUser 当前用户
     */
    void deleteByEmpDep(String companyId, String empId, String depId, TokenUser tokenUser);

    /**
     * 保存员工的部门
     *
     * @param companyId 公司id
     * @param empId     员工id
     * @param depIdList 部门id
     * @param tokenUser 当前用户
     */
    void saveEmpDeps(String companyId, String empId, List<String> depIdList, TokenUser tokenUser);

    /**
     * 查询某个部门所有的部门与员工关联关系
     *
     * @param companyId 公司id
     * @param depIds    部门id
     * @param siteId    站点id
     * @return 某个部门所有的部门与员工关联关系
     */
    List<EmpDepDO> listAllByDepId(String companyId, String siteId, String... depIds);

    /**
     * 获取公司下所有部门与员工关联关系
     *
     * @param companyId 公司id
     * @param siteId    站点
     * @return 公司下所有部门与员工关联关系
     */
    List<EmpDepDO> listAllByCompany(String companyId, String siteId);

    /**
     * 移除部门下某些员工
     *
     * @param depId     部门id
     * @param tokenUser 当前用户
     * @param empIds    员工id
     */
    Integer deleteEmpByDep(String depId, TokenUser tokenUser, String... empIds);

    /**
     * 查询某个员工的所有部门
     *
     * @param companyId 公司id
     * @param empId     员工id
     * @param siteId    站点id
     * @return 某个员工的所有部门
     */
    List<EmpDepDO> listAllByEmpId(String companyId, String empId, String siteId);

    /**
     * 查询员工所在部门
     *
     * @param empId     员工Id
     * @param tokenUser 当前用户
     * @return 部门
     */
    String selectDepByEmpId(String empId, TokenUser tokenUser);

    /**
     * 查询某个部门下的员工Id
     *
     * @param depIdList   部门id
     * @param empDepQuery 查询参数
     * @param siteId      站点
     * @return 部门员工Id List
     */
    List<String> selectEmpIdListByDepId(List<String> depIdList, EmpDepQuery empDepQuery, String siteId);

    /**
     * 根据部门Id查询部门下人员
     *
     * @param empDepQuery 查询参数
     * @param tokenUser 当前用户
     * @return 人员
     */
    Page<EmpReduceInfoVO> selectEmpByDepId(EmpDepQuery empDepQuery, TokenUser tokenUser);
}


